<?php

namespace App\Http\Requests;

use App\Models\Patient;
use Illuminate\Database\Query\Builder;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;

class AuxiliaryStoreRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     * @return bool
     */
    public function authorize()
    {
        return \Auth::check();
    }

    /**
     * Get the validation rules that apply to the request.
     * @return array
     */
    public function rules()
    {
        return [
            'record_id' => [
                'required', 'integer', 'min:1',
                Rule::exists('st_medical_records', 'id')->where(function (Builder $query) {
                    $query->whereNull('deleted_at');
                    $user = \Auth::user();
                    if ($user instanceof Patient) {
                        $query->where(['patient_id' => $user->id]);
                    } else if (!$user->isDoctorsAdmin() && !$user->isAdmin()) {
                        $query->where(['doctor_id' => $user->id]);
                    }
                }),
            ],
            //  通用性定义
            '*.time'    => 'nullable|date_format:Y-m-d|before_or_equal:now',
            '*.site'    => 'nullable|boolean',
            '*.print'   => 'nullable|in:on',

            '*.*.result_n'                            => 'nullable|numeric|min:0|max:10000|decimal:4',
            '*.*.result_b'                            => 'nullable|boolean',
            '*.*.result_a'                            => 'array',
            '*.*.result_a.result_b'                   => 'nullable|boolean',
            '*.*.result_a.result_n'                   => 'nullable|numeric|min:0|max:10000|decimal:4',
            '*.*.allergy'                             => 'nullable|string|max:50',
            '*.*.critical'                            => 'nullable|string|max:50',
            '*.*.remark'                              => 'nullable|string|max:50',

            //  通用性定义结束
            'diabetes_antibody.ica.result_a.result_s' => 'nullable|string|min:0|max:10',
            'blood.glu0.unit'                         => 'nullable|required_with:blood.glu0.result|in:mmol/L,mg/dL',
            'blood.glu2.unit'                         => 'nullable|required_with:blood.glu2.result|in:mmol/L,mg/dL',

            'ogtt.*.results_n'   => 'nullable|array|max:5',
            'ogtt.*.results_n.*' => 'nullable|numeric|min:0|max:10000|decimal:4',
            'remark'             => 'nullable|string|max:255',
        ];
    }

    public function messages()
    {
        return [
            'record_id.required'                      => '缺少病历ID',
            'record_id.integer'                       => '病历ID 必须是整数。',
            'record_id.min'                           => '病历ID 必须大于等于 :min。',
            'record_id.exists'                        => '病历 不存在或无修改该病历的权限。',
            'ogtt.glu.results_n.max'                  => 'ogtt 葡萄糖检查结果 最多只能有 :max 项。',
            'ogtt.ins.results_n.max'                  => 'ogtt 胰岛素检查结果 最多只能有 :max 项。',
            'ogtt.c-p.results_n.max'                  => 'ogtt 血浆C肽检查结果 最多只能有 :max 项。',
            'ogtt.glu.results_n.*.numeric'            => 'ogtt 葡萄糖检查结果 必须是一个数字。',
            'ogtt.ins.results_n.*.numeric'            => 'ogtt 胰岛素检查结果 必须是一个数字。',
            'ogtt.c-p.results_n.*.numeric'            => 'ogtt 血浆C肽检查结果 必须是一个数字。',
            'ogtt.glu.results_n.*.min'                => 'ogtt 葡萄糖检查结果 必须大于 :min。',
            'ogtt.ins.results_n.*.min'                => 'ogtt 胰岛素检查结果 必须大于 :min。',
            'ogtt.c-p.results_n.*.min'                => 'ogtt 血浆C肽检查结果 必须大于 :min。',
            'ogtt.glu.results_n.*.max'                => 'ogtt 葡萄糖检查结果 必须大于 :max。',
            'ogtt.ins.results_n.*.max'                => 'ogtt 胰岛素检查结果 必须大于 :max。',
            'ogtt.c-p.results_n.*.max'                => 'ogtt 血浆C肽检查结果 必须大于 :max。',
            'ogtt.*.results_n.*.decimal'              => '检查结果 可保留 4位小数。',
            'diabetes_antibody.ica.result_a.result_s' => '输入值的长度 最多 :max个字符。',

            '*.time.date_format'     => '日期格式不正确，例：1997-04-11。',
            '*.time.before_or_equal' => '测量日期 必须要早于当前时间。',

            '*.site.boolean' => '检查地点 输入值的类型必须是布尔值。',
            '*.print.in'     => '是否打印 输入值的类型错误。',

            '*.*.result_n.numeric' => '检查结果 必须是一个数字。',
            '*.*.result_n.min'     => '检查结果 必须大于 :min。',
            '*.*.result_n.max'     => '检查结果 必须小于 :max。',
            '*.*.result_n.decimal' => '检查结果 可保留 4位小数。',
            '*.*.result_b.boolean' => '输入值的类型必须是布尔值。',

            '*.*.allergy.max'  => '药敏结果 最大 :max个字符',
            '*.*.critical.max' => '危急提示 最大 :max个字符',
            '*.*.remark.max'   => '备注 最大 :max 个字符',
            'remark.max'       => '备注最大 :max 个字符',
        ];
    }
}
